R语言学习笔记(二)
导 语
之前,小编给大家介绍过R语言和Rstudio的安装(R语言学习笔记(一))。如果希望继续了解R语言的基础内容可关注“投必得医学”公众号,里面有关于R语言基本操作、数据结构、统计基础等干货内容。小编在这里作为一名非专业的R语言爱好者,给大家分享一些个人觉得非常实用的R包和作图的一些经验,希望对大家有所帮助。本期给大家带来的是dplyr这个包的介绍和基本用法。
dplyr简介
开发这个包的是鼎鼎大名的R语言大神Hadley Wickham,他目前是Rstudio的首席科学家,除了dplyr包,还有包括ggplot2、reshape、tidyverse等应用极为广泛的R包也是他开发的。这里介绍的dplyr包主要是用来操作数据框的,概括起来主要有五大最常用的功能,包括过滤、筛选、排列、变换、汇总。大多数功能通过R的基础函数也能实现,但dplyr的强大之处就在于只要一个简单的函数就能完成,十分方便。
安装、加载、导入数据
> setwd("E:/Rwork/Data_analysis") #设置工作路径
>library(dplyr)
> library(hflights)
> data("hflights") #加载数据
> dim(hflights) #查看数据大小
[1] 227496 21
可以看到这个数据集很大,我们取一小部分数据做示例。
> flight <- hflights[1:120, 1:6] #数据框的切片操作,表示取前6行
> head(flight) #查看数据
Year Month DayofMonth DayOfWeek DepTime ArrTime
5424 2011 1 1 6 1400 1500
5425 2011 1 2 7 1401 1501
5426 2011 1 3 1 1352 1502
5427 2011 1 4 2 1403 1513
5428 2011 1 5 3 1405 1507
5429 2011 1 6 4 1359 1503
右滑查看更多>>
dplyr功能实现
(1)过滤(filter)
比如这里要过滤上面flight数据集中1月1日的航班信息,我们可以先尝试用R的基本功能实现,如下:
> flights[flights$Month==1 & flights$DayofMonth==1, ]
Year Month DayofMonth DayOfWeek DepTime ArrTime
5424 2011 1 1 6 1400 1500
6343 2011 1 1 6 728 840
19266 2011 1 1 6 1631 1736
23655 2011 1 1 6 1756 2112
右滑查看更多>>
可以看到有4趟航班,那么用dplyr包怎么做呢:
> filter(flights, Month == 1, DayofMonth == 1)
Year Month DayofMonth DayOfWeek DepTime ArrTime
1 2011 1 1 6 1400 1500
2 2011 1 1 6 728 840
3 2011 1 1 6 1631 1736
4 2011 1 1 6 1756 2112
右滑查看更多>>
> filter(flights, DayofMonth == 1 | DayOfWeek == 2)
右滑查看更多>>
(2)选择(select)
选择通常是指按照列名选择特定的列,比如我们要选取Month, DayOfMonth, DayOfWeek这3列,同样我们先用R的基本功能实现:
> flights[, c("Month", "DayofMonth", "DayOfWeek")] #按列名选择
> flights[, c(2,3,4)] #表示取第2、3、4列
右滑查看更多>>
用dplyr实现则更加简单:
> select(flights, Month, DayofMonth, DayOfWeek)
> select(flights, c(2,3,4))
右滑查看更多>>
这里顺便提一下dplyr中的管道操作,符号是” %>%”,灵活运用能够简化代码,并且增加代码的可读性。比如我们需要选择flights数据集中的Month, DayOfMonth, DayOfWeek这3列,并且筛选出周一的航班,通常的写法是:
>filter(select(flights, Month, DayofMonth, DayOfWeek), DayOfWeek == 1)
右滑查看更多>>
这样写当然没问题,但是两个函数嵌在一起,显得不够简洁,如果加上管道符:
>flights %>%
select(flights, Month, DayofMonth, DayOfWeek) %>%
filter(DayOfWeek == 1)
右滑查看更多>>
虽然看起来代码量变多了,但一目了然,很容易就能读出代码在做什么。
(3)排列(arrange)
排列通常是指按照某个顺序对行进行排列,比如我们想选择flights数据集中的Month, DayOfMonth, DayOfWeek这3列,并且按照DayOfWeek进行排序。还是先用R基本功能实现:
>flights[order(flights$DayOfWeek), c(2, 3, 4)]
右滑查看更多>>
>flights %>%
select(c(2, 3, 4)) %>%
arrange(DayOfWeek)
若需要降序排列,则用函数”desc”:
>flights %>%
select(c(2,3,4)) %>%
arrange(desc(DayOfWeek))
(4)变换(mutate)
变换通常指增加一个新的变量,在数据框中表现为新增一列,比如我们需要在flights数据集中增加一列飞行时间(FliTime),数据是用到达时间(ArrTime)减去出发时间(DepTime),还是先用R基本功能实现:
> flights$FliTime <- flights$ArrTime - flights$DepTime
> head(flights)
Year Month DayofMonth DayOfWeek DepTime ArrTime FliTime
5424 2011 1 1 6 1400 1500 100
5425 2011 1 2 7 1401 1501 100
5426 2011 1 3 1 1352 1502 150
5427 2011 1 4 2 1403 1513 110
5428 2011 1 5 3 1405 1507 102
5429 2011 1 6 4 1359 1503 144
右滑查看更多>>
可以看到flights新增了一列FliTime。同样我们用dplyr实现:
>flights %>% mutate(FliTime = ArrTime - DepTime)
右滑查看更多>>
注意这样操作与上面的代码是有区别的,因为变换之后新增的列没有保存,若需要保存新增的列,则需要这样操作:
> flights <- flights %>% mutate(FliTime = ArrTime - DepTime)
右滑查看更多>>
(5)汇总(summarize)
汇总是指将数据进行归纳整理,如最简单的求极指、平均值、中位数等等。比如我们想按照周一到周天统计航班的平均飞行时间,用R基本函数实现如下:
> with(flights, tapply(FliTime, DayOfWeek, mean))
1 2 3 4 5 6 7
120.0500 107.4375 109.0000 113.5625 115.3125 120.5625 117.0500
右滑查看更多>>
如果用dplyr:
>flights %>%
group_by(DayOfWeek) %>%
summarise(avg_delay = mean(FliTime))
结果如下:
# A tibble: 7 x 2
DayOfWeek avg_delay
<int> <dbl>
1 1 120.
2 2 107.
3 3 109
4 4 114.
5 5 115.
6 6 121.
7 7 117.
直接生成了一个表格,相比R中基本的tapply函数,用法更加简单,结果也更加清楚。
结语:
以上就是dplyr的基本功能了,这里小编完全是抛砖引玉,因为dplyr的强大之处完全不是上面几个简单的例子就能概括的。大家在使用中有什么问题欢迎进入投必得R语言与统计交流群,和小编一起交流R语言学习心得。
↑↑↑扫码加小编微信↑↑↑
往期好文推荐
(点击下方文字即可阅读)
常用生物学软件的安装与应用(五)— 强大的工具进行进化树的构建与美化
今日视频推荐
在线文本改写或重写复杂语句,这个SCI润色工具不一般!点开视频即可了解!↑↑↑关注“投必得学术”视频号,更多干货↑↑↑
请大家点击右下角